Fix two memory handling problems in GtkTreeView: (#322350, Søren
authorMatthias Clasen <mclasen@redhat.com>
Sun, 27 Nov 2005 20:36:15 +0000 (20:36 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sun, 27 Nov 2005 20:36:15 +0000 (20:36 +0000)
2005-11-27  Matthias Clasen  <mclasen@redhat.com>

Fix two memory handling problems in GtkTreeView: (#322350,
Søren Sandmann)

* gtk/gtktreeview.c (gtk_tree_view_destroy)
(gtk_tree_view_set_model): Remove all references to nodes in
the old model.
(gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node
before removing the children.

ChangeLog
ChangeLog.pre-2-10
gtk/gtktreeview.c

index 5e663521514d1eef39bf2de583a6aa2b6b31c9ea..92b773037caefa21eef4cacb8e13293e410f14ad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2005-11-27  Matthias Clasen  <mclasen@redhat.com>
 
+       Fix two memory handling problems in GtkTreeView: (#322350, 
+       Søren Sandmann)
+       
+       * gtk/gtktreeview.c (gtk_tree_view_destroy) 
+       (gtk_tree_view_set_model): Remove all references to nodes in
+       the old model.
+       (gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node
+       before removing the children.
+
        * gtk/gtkcolorbutton.c (gtk_color_button_init): Don't leak a 
        PangoLayout here.  (#322505, Paolo Borelli)
 
index 5e663521514d1eef39bf2de583a6aa2b6b31c9ea..92b773037caefa21eef4cacb8e13293e410f14ad 100644 (file)
@@ -1,5 +1,14 @@
 2005-11-27  Matthias Clasen  <mclasen@redhat.com>
 
+       Fix two memory handling problems in GtkTreeView: (#322350, 
+       Søren Sandmann)
+       
+       * gtk/gtktreeview.c (gtk_tree_view_destroy) 
+       (gtk_tree_view_set_model): Remove all references to nodes in
+       the old model.
+       (gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node
+       before removing the children.
+
        * gtk/gtkcolorbutton.c (gtk_color_button_init): Don't leak a 
        PangoLayout here.  (#322505, Paolo Borelli)
 
index baa2386235ce2d7132217d6e480d75488bc3a109..fac7393a346aca81d6a300758412c3d3a33ab796 100644 (file)
@@ -1313,6 +1313,20 @@ gtk_tree_view_finalize (GObject *object)
 /* GtkObject Methods
  */
 
+static void
+gtk_tree_view_free_rbtree (GtkTreeView *tree_view)
+{
+  _gtk_rbtree_free (tree_view->priv->tree);
+  
+  tree_view->priv->tree = NULL;
+  tree_view->priv->button_pressed_node = NULL;
+  tree_view->priv->button_pressed_tree = NULL;
+  tree_view->priv->prelight_tree = NULL;
+  tree_view->priv->prelight_node = NULL;
+  tree_view->priv->expanded_collapsed_node = NULL;
+  tree_view->priv->expanded_collapsed_tree = NULL;
+}
+
 static void
 gtk_tree_view_destroy (GtkObject *object)
 {
@@ -1337,8 +1351,8 @@ gtk_tree_view_destroy (GtkObject *object)
   if (tree_view->priv->tree != NULL)
     {
       gtk_tree_view_unref_and_check_selection_tree (tree_view, tree_view->priv->tree);
-      _gtk_rbtree_free (tree_view->priv->tree);
-      tree_view->priv->tree = NULL;
+
+      gtk_tree_view_free_rbtree (tree_view);
     }
 
   if (tree_view->priv->selection != NULL)
@@ -9464,15 +9478,7 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
                                           tree_view->priv->model);
 
       if (tree_view->priv->tree)
-       {
-         _gtk_rbtree_free (tree_view->priv->tree);
-         tree_view->priv->tree = NULL;
-       }
-
-      tree_view->priv->prelight_node = NULL;
-      tree_view->priv->prelight_tree = NULL;
-      tree_view->priv->button_pressed_node = NULL;
-      tree_view->priv->button_pressed_tree = NULL;
+       gtk_tree_view_free_rbtree (tree_view);
 
       gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
       tree_view->priv->drag_dest_row = NULL;
@@ -10966,6 +10972,14 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
       gtk_tree_path_free (lsc);
     }
 
+  if (tree_view->priv->expanded_collapsed_node != NULL)
+    {
+      GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
+      GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
+      
+      tree_view->priv->expanded_collapsed_node = NULL;
+    }
+
   if (gtk_tree_view_unref_and_check_selection_tree (tree_view, node->children))
     {
       _gtk_rbtree_remove (node->children);
@@ -10980,14 +10994,6 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
       tree_view->priv->expand_collapse_timeout = 0;
     }
   
-  if (tree_view->priv->expanded_collapsed_node != NULL)
-    {
-      GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
-      GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
-      
-      tree_view->priv->expanded_collapsed_node = NULL;
-    }
-
   if (animate)
     {
       tree_view->priv->expand_collapse_timeout = g_timeout_add (50, expand_collapse_timeout, tree_view);